package persistencia;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.UUID;

import javax.xml.stream.events.StartElement;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import cena.Ponto;

public class PersistenciaLabirintoXML {

	// http://dom4j.sourceforge.net/dom4j-1.6.1/guide.html
	public static Random randomizador;
	private static Document documentoXML;
	private static List<Element> listaLabirintos;

	static {
		randomizador = new Random();
		documentoXML = DocumentHelper.createDocument();
		try {
			ler();
			listar();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public PersistenciaLabirintoXML() {

	}

	// public static void main(String[] args) throws DocumentException,
	// IOException {
	// System.out.println("INICIO");
	// elementLabiritos(3, criar());
	// gravar(documentoXML);
	// System.out.println(listar());
	// System.out.println("FIM");
	// }

	// public static short[][] gerarLabirintoRandomico() {
	// short comprimento = (short) ((randomizador.nextInt(9) + 2) * 2);
	// short largura = (short) ((randomizador.nextInt(9) + 2) * 2);
	// short[][] labirinto = new short[comprimento][largura];
	//
	// for (short i = 0; i < comprimento; i++) {
	// for (short j = 0; j < largura; j++) {
	// labirinto[i][j] = (byte) randomizador.nextInt(2);
	// }
	//
	// }
	// return labirinto;
	// }

	// private static Element criar() throws DocumentException {
	// Element elementAplicacao = documentoXML.addElement("aplicacao");
	// return elementAplicacao;
	// }
	//
	// private static void gravar(Document documentoXML) throws IOException {
	// FileOutputStream fos = new FileOutputStream("labirinto.xml");
	// OutputFormat format = OutputFormat.createPrettyPrint();
	// XMLWriter writer = new XMLWriter(fos, format);
	// writer.write(documentoXML);
	// writer.flush();
	// }

	private static Document ler() throws Exception {
		SAXReader reader = new SAXReader();
		documentoXML = reader.read("labirinto.xml");
		return documentoXML;
	}

	public static List<Element> listar() {
		Element aplicacao = documentoXML.getRootElement();
		Element labirintos = aplicacao.element("labirintos");
		listaLabirintos = labirintos.elements("labirinto");
		return listaLabirintos;
	}

	public static byte[][] retornaLabirinto(int id) {
		Element labirinto = listaLabirintos.get(id);

		int comprimento = Integer.parseInt(labirinto.attribute("comprimento")
				.getStringValue());
		int largura = Integer.parseInt(labirinto.attribute("largura")
				.getStringValue());
		byte[][] labirintoBytes = new byte[comprimento][largura];

		System.out.println("Comprimeiro = " + comprimento);
		System.out.println("LARGURA = " + largura);
		List<Element> celulas = labirinto.elements("celula");
		int index = 0;
		for (int i = 0; i < labirintoBytes.length; i++) {
			for (int j = 0; j < labirintoBytes[i].length; j++) {
				Element celula = celulas.get(index);
				index++;
				if (celula.getText().equals("")) {
					labirintoBytes[i][j] = '0';
				} else {
					labirintoBytes[i][j] = Byte.parseByte(celula.getText());
				}

			}
		}

		return labirintoBytes;
	}

	public static Ponto retornaPontoInicial(int id) {
		Element labirinto = listaLabirintos.get(id);
		Element inicial = labirinto.element("inicio");
		double posicaoX = Double.parseDouble(inicial.attribute("posicaoX")
				.getStringValue());
		double posicaoY = Double.parseDouble(inicial.attribute("posicaoY")
				.getStringValue());
		return new Ponto(posicaoX, posicaoY);
	}

	public static Ponto retornaPontoFinal(int id) {
		System.out.println("ID = " + id);
		Element labirinto = listaLabirintos.get(id);
		Element inicial = labirinto.element("fim");
		double posicaoX = Double.parseDouble(inicial.attribute("posicaoX")
				.getStringValue());
		double posicaoY = Double.parseDouble(inicial.attribute("posicaoY")
				.getStringValue());
		return new Ponto(posicaoX, posicaoY);
	}

	public static short retornaAlturaLabirinto(int id) {
		System.out.println("ID = " + id);
		Element labirinto = listaLabirintos.get(id);
		short largura = Short.parseShort(labirinto.attribute("largura")
				.getStringValue());
		return largura;
	}

	public static short retornaComprimentoLabirinto(int id) {
		Element labirinto = listaLabirintos.get(id);
		short comprimento = Short.parseShort(labirinto.attribute("comprimento")
				.getStringValue());
		return comprimento;
	}

	public void atualizar() {

	}

	public void deletar() {

	}

	// private static Element elementLabirinto(short[][] labirinto,
	// Element elementLabirintos) {
	//
	// // Element Labirinto
	// Element elementLabirinto = elementLabirintos.addElement("labirinto");
	// elementLabirinto.addAttribute("id", UUID.randomUUID() + "");
	// elementLabirinto.addAttribute("comprimento", labirinto.length + "");
	// elementLabirinto.addAttribute("largura", labirinto[0].length + "");
	//
	// // Element Inicio
	// Element elementCelulaInicio = elementLabirinto.addElement("inicio");
	// elementCelulaInicio.addAttribute("posicaoX", 0 + "");
	// elementCelulaInicio.addAttribute("posicaoY", 0 + "");
	//
	// // Element Fim
	// Element elementoCelulaFim = elementLabirinto.addElement("fim");
	// elementoCelulaFim.addAttribute("posicaoX", labirinto.length - 1 + "");
	// elementoCelulaFim
	// .addAttribute("posicaoY", labirinto[0].length - 1 + "");
	//
	// for (int i = 0; i < labirinto.length; i++) {
	// for (int j = 0; j < labirinto[i].length; j++) {
	// // Element Celula
	// Element elementCelula = elementLabirinto.addElement("celula");
	// elementCelula.addAttribute("posicaoX", i + "");
	// elementCelula.addAttribute("posicaoY", j + "");
	// elementCelula.addText(labirinto[i][j] + "");
	//
	// }
	// }
	// return elementLabirinto;
	// }
	//
	// private static Element elementLabiritos(int numeroLabirintos,
	// Element element) {
	// Element elementLabirintos = element.addElement("labirintos");
	// for (int i = 0; i < numeroLabirintos; i++) {
	// elementLabirinto(gerarLabirintoRandomico(), elementLabirintos);
	// }
	// return elementLabirintos;
	// }

}
